package my_linkedlist;/*
 *@ 代阳敲的专属代码
 **/

public class My_LinkedList implements List{
    static  class LinkedNode {
        LinkedNode next;
        int val;

        public LinkedNode(int val) {
            this.val = val;
        }
    }
    private LinkedNode head;
    private LinkedNode tail;
    private  int usSize;
    @Override
    public void addFirst(int data) {
        LinkedNode linkedNode =new LinkedNode(data);
        if(head==null) {
            head=linkedNode;
            tail=linkedNode;
            usSize++;
        }
        else {
            linkedNode.next=head;
            head=linkedNode;
            usSize++;
        }


    }

    @Override
    public void addLast(int data) {
        LinkedNode linkedNode=new LinkedNode(data);
        if(tail==null) {
            head=linkedNode;
            tail=linkedNode;
            usSize++;
        }
        else {
            tail.next=linkedNode;
            tail=linkedNode;
            usSize++;
        }

    }

    @Override
    public void addIndex(int index, int data) {

        if(index<0||index>size()) {
            throw new IndexException("index不合法");
        }
        if(index==0) {
            addFirst(data);
        } else if (index==size()) {
            addLast(data);
        } else {
            LinkedNode linkedNode=new LinkedNode(data);
            LinkedNode cur =indexCur(index);
            linkedNode.next=cur.next;
            cur.next=linkedNode;
        }


    }

    private LinkedNode indexCur(int index) {
        LinkedNode cur=head;
        while(index>1) {
            cur=cur.next;
            index--;
        }
        return cur;
    }

    @Override
    public boolean contains(int key) {
        LinkedNode cur=head;
        while(cur!=null) {
            if(cur.val==key) {
                return true;
            }
            cur=cur.next;
        }
        return  false;
    }

    @Override
    public void remove(int key) {
        if(head==null) {
            return;
        }
        LinkedNode cur=head;
        if(cur.val==key) {
            head= head.next;
            return;
        }
        while(cur.next!=null) {
            if (cur.next.val==key) {
                cur.next=cur.next.next;
                break;
            }
            cur=cur.next;

        }
    }

    @Override
    public void removeAllKey(int key) {
        if(head==null) {
            return;
        }
        LinkedNode cur=head;

        while(cur.next!=null) {
            if (cur.next.val==key) {
                cur.next=cur.next.next;
                continue;
            }
            cur=cur.next;
        }
        if(head.val==key) {
            head= head.next;
        }

    }

    @Override
    public int size() {
        return usSize;
    }

    @Override
    public void clear() {
        head=null;
        tail=null;
        usSize=0;
    }

    @Override
    public void display() {
        LinkedNode cur=head;
        while(cur!=null) {
            System.out.print(cur.val+" ");
            cur=cur.next;
        }
        System.out.println();
    }
}
